1
2
3
4 package uk.ac.roe.antigen.textcomponents;
5
6 import java.io.BufferedInputStream;
7 import java.io.DataInputStream;
8 import java.io.IOException;
9 import java.util.ArrayList;
10 import java.util.Hashtable;
11 import java.util.Iterator;
12 import java.util.List;
13 import java.util.Vector;
14 import java.util.logging.Logger;
15
16 import org.apache.tools.ant.Project;
17 import org.apache.tools.ant.Target;
18
19 import sun.rmi.runtime.Log;
20 import uk.ac.roe.antigen.builder.TargetChooser;
21 import uk.ac.roe.antigen.utils.Config;
22
23 /***
24 * A Text version of the TargetChoiceFrame
25 *
26 * @author jdt
27 */
28 public class TextTargetChooser implements TargetChooser {
29 /***
30 * Logger for this class
31 */
32 private static final Logger logger = Logger.getLogger(TextTargetChooser.class.getName());
33
34
35 /***
36 * Auto-generated main method to display this JDialog
37 */
38 public static void main(String[] args) {
39 Config.load("/config.properties");
40 Config.setProperty(ANTIGEN_TARGETS, "foo,bar,not,eek");
41 Config.setProperty(ANTIGEN_TARGET_ + "foo.selected", "true");
42 Config.setProperty(ANTIGEN_TARGET_ + "bar.selected", "false");
43 Config.setProperty(ANTIGEN_TARGET_ + "not.selected", "true");
44
45 Project project2 = new Project();
46 Target target = new Target();
47 target.setName("foo");
48 target.setDescription("Foos description");
49 project2.addTarget(target);
50
51 target = new Target();
52 target.setName("bar");
53 project2.addTarget(target);
54 target = new Target();
55 target.setName("eek");
56 project2.addTarget(target);
57
58 TargetChooser inst = new TextTargetChooser(project2);
59
60 List targets = inst.showAndWaitForResponse();
61 System.out.println("Selected tasks:");
62 Iterator it = targets.iterator();
63 while (it.hasNext()) {
64 String taskName = (String) it.next();
65 System.out.println(taskName);
66 }
67 }
68
69 private Project project;
70
71 public TextTargetChooser(Project project) {
72 this.project = project;
73 setUpTasks();
74 }
75
76 /***
77 * Parse the list of targets and set up the checkboxes accordingly
78 */
79 private void setUpTasks() {
80 String targetString = Config.getProperty(ANTIGEN_TARGETS);
81 logger.fine("Found targets: " + targetString);
82 if (targetString == null) {
83 return;
84 }
85 Hashtable projectTargets = project.getTargets();
86 String[] targets = targetString.split(",");
87 logger.fine("Split into " + targets.length);
88 for (int i = 0; i < targets.length; ++i) {
89 String targetName = targets[i];
90 Target target = (Target) projectTargets.get(targetName);
91 if (target != null) {
92 String description = target.getDescription();
93 String selectedOpt = Config.getProperty(ANTIGEN_TARGET_
94 + targetName + ".selected");
95 boolean selected = true;
96 if ("false".equals(selectedOpt)) {
97 selected = false;
98 }
99 taskDescs.add(new TaskDescription(targetName, description,
100 selected));
101 logger.fine("Target " + targetName + " found (" + description
102 + "). Is selected initially? " + selected);
103 } else {
104 logger.fine("Target " + targetName
105 + " not found in project, skipping");
106 }
107 }
108
109 }
110
111 private List taskDescs = new ArrayList();
112
113 private class TaskDescription {
114
115 private String name;
116
117 private String description;
118
119 private boolean defaultSelected;
120
121 private String label;
122
123 public TaskDescription(String name, String description, boolean selected) {
124 this.name = name;
125 this.description = description;
126 this.defaultSelected = selected;
127 assert name != null;
128 label = description != null ? description : name;
129 }
130
131 public boolean isSelectedByDefault() {
132 return defaultSelected;
133 }
134
135 /***
136 * @return Returns the label.
137 */
138 public String getLabel() {
139 return label;
140 }
141
142 /***
143 * @return Returns the description.
144 */
145 public String getDescription() {
146 return description;
147 }
148
149 /***
150 * @return Returns the name.
151 */
152 public String getName() {
153 return name;
154 }
155 }
156
157 /***
158 * Display the dialog and return an array of the selected options
159 *
160 * @return
161 */
162 public Vector showAndWaitForResponse() {
163 showChoices();
164 System.out
165 .println("---Enter choices as a comma-separated list, or press return to accept the [defaults]");
166
167 DataInputStream dataInputStream = new DataInputStream(
168 new BufferedInputStream(System.in));
169 boolean unhappy = true;
170 Vector theChosen=null;
171 while (unhappy) {
172 theChosen = new Vector();
173 String input;
174 try {
175 logger.fine("Waiting for input");
176 input = dataInputStream.readLine().trim();
177 } catch (IOException e) {
178
179 logger.warning(e.getMessage());
180 break;
181 }
182 logger.fine("Input: |" + input + "|");
183 if ("".equals(input)) {
184 logger.fine("return pressed - selecting defaults");
185 Iterator it = taskDescs.iterator();
186 while (it.hasNext()) {
187 TaskDescription desc = (TaskDescription) it.next();
188 if (desc.isSelectedByDefault()) theChosen.add(desc.getName());
189 }
190 unhappy = false;
191 } else {
192 String[] choices = input.split(",");
193 for (int i = 0; i < choices.length; ++i) {
194 unhappy = false;
195 try {
196 int choice = Integer.parseInt(choices[i]);
197 if (choice < 1 || choice > taskDescs.size()) {
198 System.out.println("Choosing "+choice+" is invalid");
199 unhappy=true;
200 break;
201 } else {
202 TaskDescription taskDescription = (TaskDescription)taskDescs.get(choice-1);
203 theChosen.add(taskDescription.getName());
204 }
205 } catch (NumberFormatException e1) {
206
207 System.out
208 .println("Invalid entry - must be a comma-separated list of numbers");
209 unhappy=true;
210 break;
211 }
212
213 }
214
215
216 }
217 }
218 logger.fine("Choice made");
219
220 return theChosen;
221 }
222
223 /***
224 * Display the choices of tasks to the user
225 */
226 private void showChoices() {
227 System.out.println("Please select from the following tasks:");
228 for (int i = 0; i < taskDescs.size(); ++i) {
229 TaskDescription description = (TaskDescription) taskDescs.get(i);
230 String prompt = description.isSelectedByDefault() ? "["
231 + Integer.toString(i + 1) + "]" : " "
232 + Integer.toString(i + 1) + " ";
233 System.out.println(prompt + " - " + description.getLabel());
234 }
235 }
236
237 }